Caso Práctico, Ejercicio 1: Exploración y Análisis de Datos¶

Módulo 1: Las Herramientas del Científico de Datos¶

Maestría en Inteligencia Artificial (AI) - IMF¶

Autor: Jesús Troconiz¶

Portafolio: jtd.com.ar¶

Tabla de Contenido:¶

  1. Descripción del Trabajo
  2. Descripción del Proyecto
  3. Librerías utilizadas
  4. Extracción, Limpieza y Transformación de los Datos (ETL)

    4.1 Carga de los datos 4.2 Identificación de las Columnas 4.3 Unión de los DataFrames 4.4 Manejo de Valores Nulos 4.5 Resumen estadístico

  5. Análisis Exploratorio

    5.1 Relación Familia y Salud (Gráfica) 5.2 Relación Felicidad y Confianza (Gráfica) 5.3 Matriz de Correlación 5.4 Agrupar por País (Máximo Felicidad) 5.5 Relación Felicidad y Generosidad (Gráfica) 5.6 Distribución del Grado de Distopía por Región

  6. Conclusiones

  7. Recomendaciones

1. Descripción del Trabajo¶

Este proyecto se enmarca dentro del Módulo 1 del curso y se trata de un ejercicio práctico que tiene como objetivo aplicar los conocimientos adquiridos en el primer módulo del curso. El proyecto se basa en la exploración y análisis de datos del "Informe Mundial de la Felicidad" correspondiente a los años 2015 y 2016.

Se pide:¶

Los objetivos principales de este proyecto son los siguientes:

  1. Cargar los dos CSV como datasets.
  2. Identificar las columnas de ambos datasets: ¿hay diferencias entre ambos?
  3. Unir ambos dataframes, sin importar que los dos compartan las mismas diferencias.
  4. Revisar el número de nulos que hay por cada columna, así como su porcentaje.
  5. Cambiar los valores nulos de las columnas "Lower Confidence Interval" y "Upper Confidence Interval" por un número aleatorio entre el valor mínimo y máximo de la misma columna (un único número, no es necesario uno diferente para cada fila con valor nulo).
  6. Cambiar los valores nulos de la columna "Standard Error" por su media al cuadrado.
  7. Obtener un resumen estadístico del dataframe sin valores nulos.
  8. Mostrar de forma gráfica la relación entre la familia y la salud.
  9. Mostrar de forma gráfica la relación entre la puntuación de felicidad y la confianza (corrupción del gobierno).
  10. Mostrar la matriz de correlación del dataframe.
  11. Tras unir los dataframes, los países aparecerán más de una vez. Mostrar agrupado el dataframe por país con el valor máximo de felicidad, sin importar el año.
  12. ¿Tiene relación la felicidad con la generosidad? Mostrarlo gráficamente a través de la puntuación de libertad.
  13. Mostrar la distribución del grado de distopía en función de la región.
  14. OBLIGATORIO: realizar la entrega desde un notebook en formato .ipynb.
  15. OPCIONAL: de forma opcional, puede hacerse entrega del notebook como HTML.

2. Descripción del Proyecto¶

Objetivo¶

El objetivo de este análisis de datos es utilizar la información contenida en el conjunto de datos del "Informe Mundial de la Felicidad" de los años 2015 y 2016 para comprender y explorar los patrones y las tendencias relacionadas con la felicidad a nivel global. Se busca identificar posibles correlaciones entre los factores clave que influyen en la felicidad de las personas y evaluar si existen diferencias significativas entre los años 2015 y 2016 en términos de puntuaciones de felicidad y factores asociados.

Contexto¶

El conjunto de datos del "Informe Mundial de la Felicidad" contiene información detallada sobre la evaluación de la vida y diversos factores que contribuyen a la felicidad en múltiples países. Estos datos se obtuvieron a través de la encuesta mundial Gallup y se basan en las respuestas de los encuestados a la pregunta principal de evaluación de la vida, que utiliza una escala del 0 al 10 para calificar la satisfacción con la vida. Además de las puntuaciones de felicidad, el conjunto de datos incluye información sobre los siguientes factores clave:

  1. Producción económica: Indica el nivel de desarrollo económico de un país.
  2. Apoyo social: Representa la percepción de apoyo social y redes de apoyo en la vida de las personas.
  3. Esperanza de vida: Refleja la esperanza de vida promedio en un país.
  4. Libertad: Evalúa la percepción de libertad y la capacidad de tomar decisiones propias.
  5. Ausencia de corrupción: Mide la percepción de corrupción en el gobierno y en la sociedad.
  6. Generosidad: Refleja la generosidad de la población en términos de donaciones y ayuda a otros.

Estos factores se utilizan para estimar el grado en que contribuyen a la felicidad de los individuos en cada país. Además, se compara el desempeño de cada país con una "distopía" hipotética que representa el escenario menos feliz en términos de estos factores.

Análisis de Datos¶

En el análisis de datos del "Informe Mundial de la Felicidad" correspondiente a los años 2015 y 2016, se llevará a cabo una serie de pasos clave utilizando herramientas como pandas, numpy, matplotlib, seaborn y plotly. Estos pasos incluyen la carga y preparación de los datos, la exploración de tendencias y patrones, la identificación de correlaciones entre variables y la visualización de resultados a través de gráficos. El objetivo es comprender mejor la relación entre la felicidad y los factores socioeconómicos y culturales, así como evaluar posibles diferencias entre los dos años estudiados. Este análisis proporcionará una visión más profunda de la felicidad a nivel global y su influencia en la toma de decisiones políticas y de bienestar.

3. Librerías Utilizadas¶

In [1]:
import pandas as pd
import seaborn as sns
import numpy as np

!pip install plotly
import plotly.express as px
import plotly.graph_objs as go
Requirement already satisfied: plotly in c:\users\jtroc\anaconda3\lib\site-packages (5.9.0)
Requirement already satisfied: tenacity>=6.2.0 in c:\users\jtroc\anaconda3\lib\site-packages (from plotly) (8.0.1)

4. Extracción, Limpieza y Transformación de los Datos (ETL)¶

4.1 Carga de los datos¶

In [2]:
df_2015 = pd.read_csv("2015.csv")
df_2016 = pd.read_csv("2016.csv")

4.2 Identificación de las Columnas¶

In [3]:
pd.set_option('display.max_columns', 500)
df_2015.head()
Out[3]:
Country Region Happiness Rank Happiness Score Standard Error Economy (GDP per Capita) Family Health (Life Expectancy) Freedom Trust (Government Corruption) Generosity Dystopia Residual
0 Switzerland Western Europe 1 7.587 0.03411 1.39651 1.34951 0.94143 0.66557 0.41978 0.29678 2.51738
1 Iceland Western Europe 2 7.561 0.04884 1.30232 1.40223 0.94784 0.62877 0.14145 0.43630 2.70201
2 Denmark Western Europe 3 7.527 0.03328 1.32548 1.36058 0.87464 0.64938 0.48357 0.34139 2.49204
3 Norway Western Europe 4 7.522 0.03880 1.45900 1.33095 0.88521 0.66973 0.36503 0.34699 2.46531
4 Canada North America 5 7.427 0.03553 1.32629 1.32261 0.90563 0.63297 0.32957 0.45811 2.45176
In [4]:
df_2016.head()
Out[4]:
Country Region Happiness Rank Happiness Score Lower Confidence Interval Upper Confidence Interval Economy (GDP per Capita) Family Health (Life Expectancy) Freedom Trust (Government Corruption) Generosity Dystopia Residual
0 Denmark Western Europe 1 7.526 7.460 7.592 1.44178 1.16374 0.79504 0.57941 0.44453 0.36171 2.73939
1 Switzerland Western Europe 2 7.509 7.428 7.590 1.52733 1.14524 0.86303 0.58557 0.41203 0.28083 2.69463
2 Iceland Western Europe 3 7.501 7.333 7.669 1.42666 1.18326 0.86733 0.56624 0.14975 0.47678 2.83137
3 Norway Western Europe 4 7.498 7.421 7.575 1.57744 1.12690 0.79579 0.59609 0.35776 0.37895 2.66465
4 Finland Western Europe 5 7.413 7.351 7.475 1.40598 1.13464 0.81091 0.57104 0.41004 0.25492 2.82596
In [5]:
df_2015.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 158 entries, 0 to 157
Data columns (total 12 columns):
 #   Column                         Non-Null Count  Dtype  
---  ------                         --------------  -----  
 0   Country                        158 non-null    object 
 1   Region                         158 non-null    object 
 2   Happiness Rank                 158 non-null    int64  
 3   Happiness Score                158 non-null    float64
 4   Standard Error                 158 non-null    float64
 5   Economy (GDP per Capita)       158 non-null    float64
 6   Family                         158 non-null    float64
 7   Health (Life Expectancy)       158 non-null    float64
 8   Freedom                        158 non-null    float64
 9   Trust (Government Corruption)  158 non-null    float64
 10  Generosity                     158 non-null    float64
 11  Dystopia Residual              158 non-null    float64
dtypes: float64(9), int64(1), object(2)
memory usage: 14.9+ KB
In [6]:
df_2016.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 157 entries, 0 to 156
Data columns (total 13 columns):
 #   Column                         Non-Null Count  Dtype  
---  ------                         --------------  -----  
 0   Country                        157 non-null    object 
 1   Region                         157 non-null    object 
 2   Happiness Rank                 157 non-null    int64  
 3   Happiness Score                157 non-null    float64
 4   Lower Confidence Interval      157 non-null    float64
 5   Upper Confidence Interval      157 non-null    float64
 6   Economy (GDP per Capita)       157 non-null    float64
 7   Family                         157 non-null    float64
 8   Health (Life Expectancy)       157 non-null    float64
 9   Freedom                        157 non-null    float64
 10  Trust (Government Corruption)  157 non-null    float64
 11  Generosity                     157 non-null    float64
 12  Dystopia Residual              157 non-null    float64
dtypes: float64(10), int64(1), object(2)
memory usage: 16.1+ KB
In [7]:
# Identificación de columnas
columnas_2015 = df_2015.columns
columnas_2016 = df_2016.columns

# Comparación de columnas
diferencias = set(columnas_2015) - set(columnas_2016)

print("Columnas en el dataset de 2015:", columnas_2015)
print("\nColumnas en el dataset de 2016:", columnas_2016)
print("\nDiferencias entre los datasets:", diferencias)
Columnas en el dataset de 2015: Index(['Country', 'Region', 'Happiness Rank', 'Happiness Score',
       'Standard Error', 'Economy (GDP per Capita)', 'Family',
       'Health (Life Expectancy)', 'Freedom', 'Trust (Government Corruption)',
       'Generosity', 'Dystopia Residual'],
      dtype='object')

Columnas en el dataset de 2016: Index(['Country', 'Region', 'Happiness Rank', 'Happiness Score',
       'Lower Confidence Interval', 'Upper Confidence Interval',
       'Economy (GDP per Capita)', 'Family', 'Health (Life Expectancy)',
       'Freedom', 'Trust (Government Corruption)', 'Generosity',
       'Dystopia Residual'],
      dtype='object')

Diferencias entre los datasets: {'Standard Error'}
In [8]:
diferencias2015 = df_2015.columns.difference(df_2016.columns)
diferencias2016 = df_2016.columns.difference(df_2015.columns)
print("Diferencias entre los datasets:", diferencias2015)
print("Diferencias entre los datasets:", diferencias2016)
Diferencias entre los datasets: Index(['Standard Error'], dtype='object')
Diferencias entre los datasets: Index(['Lower Confidence Interval', 'Upper Confidence Interval'], dtype='object')

Diferencias entre los Datasets¶

Al comparar los datasets correspondientes a los años 2015 y 2016 del "Informe Mundial de la Felicidad", se identificaron diferencias significativas en las columnas de datos. Estas diferencias son las siguientes:

En el dataset de 2015:

Se encuentra la columna 'Standard Error', que no está presente en el dataset de 2016. Por otro lado, en el dataset de 2016:

Se encuentran las columnas 'Lower Confidence Interval' y 'Upper Confidence Interval', las cuales no están presentes en el dataset de 2015.

4.3 Unión de los DataFrames¶


In [9]:
# Agregar una columna 'Año' a cada DataFrame
df_2015['Año'] = 2015
df_2016['Año'] = 2016
In [10]:
# inner join utilizando la columna "Country" como key
df = pd.concat([df_2015, df_2016], ignore_index=True)
In [11]:
df.head()
Out[11]:
Country Region Happiness Rank Happiness Score Standard Error Economy (GDP per Capita) Family Health (Life Expectancy) Freedom Trust (Government Corruption) Generosity Dystopia Residual Año Lower Confidence Interval Upper Confidence Interval
0 Switzerland Western Europe 1 7.587 0.03411 1.39651 1.34951 0.94143 0.66557 0.41978 0.29678 2.51738 2015 NaN NaN
1 Iceland Western Europe 2 7.561 0.04884 1.30232 1.40223 0.94784 0.62877 0.14145 0.43630 2.70201 2015 NaN NaN
2 Denmark Western Europe 3 7.527 0.03328 1.32548 1.36058 0.87464 0.64938 0.48357 0.34139 2.49204 2015 NaN NaN
3 Norway Western Europe 4 7.522 0.03880 1.45900 1.33095 0.88521 0.66973 0.36503 0.34699 2.46531 2015 NaN NaN
4 Canada North America 5 7.427 0.03553 1.32629 1.32261 0.90563 0.63297 0.32957 0.45811 2.45176 2015 NaN NaN
In [12]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 315 entries, 0 to 314
Data columns (total 15 columns):
 #   Column                         Non-Null Count  Dtype  
---  ------                         --------------  -----  
 0   Country                        315 non-null    object 
 1   Region                         315 non-null    object 
 2   Happiness Rank                 315 non-null    int64  
 3   Happiness Score                315 non-null    float64
 4   Standard Error                 158 non-null    float64
 5   Economy (GDP per Capita)       315 non-null    float64
 6   Family                         315 non-null    float64
 7   Health (Life Expectancy)       315 non-null    float64
 8   Freedom                        315 non-null    float64
 9   Trust (Government Corruption)  315 non-null    float64
 10  Generosity                     315 non-null    float64
 11  Dystopia Residual              315 non-null    float64
 12  Año                            315 non-null    int64  
 13  Lower Confidence Interval      157 non-null    float64
 14  Upper Confidence Interval      157 non-null    float64
dtypes: float64(11), int64(2), object(2)
memory usage: 37.0+ KB

4.4 Manejo de Valores Nulos¶

In [13]:
df.describe()
Out[13]:
Happiness Rank Happiness Score Standard Error Economy (GDP per Capita) Family Health (Life Expectancy) Freedom Trust (Government Corruption) Generosity Dystopia Residual Año Lower Confidence Interval Upper Confidence Interval
count 315.000000 315.000000 158.000000 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000 157.000000 157.000000
mean 79.238095 5.378949 0.047885 0.899837 0.892647 0.594054 0.399896 0.140532 0.239957 2.212032 2015.498413 5.282395 5.481975
std 45.538922 1.141531 0.017146 0.410780 0.286718 0.240790 0.150684 0.115490 0.130077 0.558728 0.500793 1.148043 1.136493
min 1.000000 2.839000 0.018480 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.328580 2015.000000 2.732000 3.078000
25% 40.000000 4.510000 0.037268 0.594900 0.739880 0.419645 0.295890 0.061315 0.151430 1.884135 2015.000000 4.327000 4.465000
50% 79.000000 5.286000 0.043940 0.973060 0.937930 0.640450 0.413190 0.106130 0.218540 2.211260 2015.000000 5.237000 5.419000
75% 118.500000 6.269000 0.052300 1.229000 1.087360 0.787640 0.516730 0.178610 0.311450 2.563470 2016.000000 6.154000 6.434000
max 158.000000 7.587000 0.136930 1.824270 1.402230 1.025250 0.669730 0.551910 0.819710 3.837720 2016.000000 7.460000 7.669000
In [14]:
valores_nulos = df.isnull().sum()

# Calcular el porcentaje de valores nulos en cada columna
porcentaje_nulos = (valores_nulos / len(df)) * 100

# Crear un DataFrame para mostrar los resultados
info_nulos = pd.DataFrame({'Valores Nulos': valores_nulos, 'Porcentaje de Nulos': porcentaje_nulos})

# Mostrar la información de valores nulos
print(info_nulos)
                               Valores Nulos  Porcentaje de Nulos
Country                                    0              0.00000
Region                                     0              0.00000
Happiness Rank                             0              0.00000
Happiness Score                            0              0.00000
Standard Error                           157             49.84127
Economy (GDP per Capita)                   0              0.00000
Family                                     0              0.00000
Health (Life Expectancy)                   0              0.00000
Freedom                                    0              0.00000
Trust (Government Corruption)              0              0.00000
Generosity                                 0              0.00000
Dystopia Residual                          0              0.00000
Año                                        0              0.00000
Lower Confidence Interval                158             50.15873
Upper Confidence Interval                158             50.15873
In [15]:
# Calcular los valores mínimos y máximos de las columnas
min_lower_confidence = df['Lower Confidence Interval'].min()
max_lower_confidence = df['Lower Confidence Interval'].max()

min_upper_confidence = df['Upper Confidence Interval'].min()
max_upper_confidence = df['Upper Confidence Interval'].max()
In [16]:
# Reemplazar valores nulos en "Lower Confidence Interval" y "Upper Confidence Interval" con números aleatorios
df['Lower Confidence Interval'].fillna(np.random.uniform(min_lower_confidence, max_lower_confidence), inplace=True)
df['Upper Confidence Interval'].fillna(np.random.uniform(min_upper_confidence, max_upper_confidence), inplace=True)


# Reemplazar valores nulos en "Standard Error" con la media al cuadrado
mean_standard_error = df['Standard Error'].mean()
df['Standard Error'].fillna(mean_standard_error**2, inplace=True)
In [17]:
valores_nulos = df.isnull().sum()

# Calcular el porcentaje de valores nulos en cada columna
porcentaje_nulos = (valores_nulos / len(df)) * 100

# Crear un DataFrame para mostrar los resultados
info_nulos = pd.DataFrame({'Valores Nulos': valores_nulos, 'Porcentaje de Nulos': porcentaje_nulos})

# Mostrar la información de valores nulos
print(info_nulos)
                               Valores Nulos  Porcentaje de Nulos
Country                                    0                  0.0
Region                                     0                  0.0
Happiness Rank                             0                  0.0
Happiness Score                            0                  0.0
Standard Error                             0                  0.0
Economy (GDP per Capita)                   0                  0.0
Family                                     0                  0.0
Health (Life Expectancy)                   0                  0.0
Freedom                                    0                  0.0
Trust (Government Corruption)              0                  0.0
Generosity                                 0                  0.0
Dystopia Residual                          0                  0.0
Año                                        0                  0.0
Lower Confidence Interval                  0                  0.0
Upper Confidence Interval                  0                  0.0

4.5 Resumen Estadístico¶

In [18]:
df.describe()
Out[18]:
Happiness Rank Happiness Score Standard Error Economy (GDP per Capita) Family Health (Life Expectancy) Freedom Trust (Government Corruption) Generosity Dystopia Residual Año Lower Confidence Interval Upper Confidence Interval
count 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000 315.000000
mean 79.238095 5.378949 0.025161 0.899837 0.892647 0.594054 0.399896 0.140532 0.239957 2.212032 2015.498413 4.062160 5.343650
std 45.538922 1.141531 0.025851 0.410780 0.286718 0.240790 0.150684 0.115490 0.130077 0.558728 0.500793 1.462554 0.812876
min 1.000000 2.839000 0.002293 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.328580 2015.000000 2.732000 3.078000
25% 40.000000 4.510000 0.002293 0.594900 0.739880 0.419645 0.295890 0.061315 0.151430 1.884135 2015.000000 2.849648 5.206201
50% 79.000000 5.286000 0.018480 0.973060 0.937930 0.640450 0.413190 0.106130 0.218540 2.211260 2015.000000 2.849648 5.206201
75% 118.500000 6.269000 0.043940 1.229000 1.087360 0.787640 0.516730 0.178610 0.311450 2.563470 2016.000000 5.231500 5.408500
max 158.000000 7.587000 0.136930 1.824270 1.402230 1.025250 0.669730 0.551910 0.819710 3.837720 2016.000000 7.460000 7.669000

5. Análisis Exploratorio¶

5.1 Relación Familia y Salud (Gráfica)¶

In [19]:
# Crear un gráfico de dispersión (scatter plot) con Plotly
fig = px.scatter(df, x='Family', y='Health (Life Expectancy)', title='Relación entre Familia y Salud')

fig.update_layout(xaxis_title='Familia',
                  yaxis_title='Salud (Espectativa de vida)')

# Mostrar el gráfico en el Notebook
fig.show()

El gráfico sugiere una leve relación positiva entre "Familia" y "Salud (Expectativa de Vida)", pero no indica una correlación fuerte ni directa.

5.2 Relación Felicidad y Confianza (Gráfica)¶

In [20]:
# Crear un gráfico de dispersión (scatter plot) con Plotly
fig = px.scatter(df, x='Happiness Score', y='Trust (Government Corruption)',
                 title='Relación entre la puntuación de felicidad  y la confianza (corrupción del gobierno).')

fig.update_layout(xaxis_title='Puntuación de felicidad',
                  yaxis_title='Confianza (corrupción del gobierno)')

# Mostrar el gráfico en el Notebook
fig.show()

Los puntos están esparcidos de manera que no sugieren una relación lineal obvia. Por lo tanto, basándose solo en este gráfico, sería razonable concluir que no hay una correlación evidente entre las dos variables.

5.3 Matriz de Correlación¶

In [21]:
# Calcular la matriz de correlación
correlation_matrix = df.corr()

# Crear una figura para mostrar la matriz de correlación con Plotly
fig = go.Figure(data=go.Heatmap(z=correlation_matrix.values,
                                x=correlation_matrix.columns,
                                y=correlation_matrix.index,
                                colorscale='Viridis'))

# Personalizar el diseño del gráfico
fig.update_layout(title='Matriz de Correlación',
                  xaxis_title='Variables',
                  yaxis_title='Variables')

# Mostrar la matriz de correlación en el Notebook
fig.show()
In [22]:
# Crear una lista para almacenar los resultados
correlaciones_filtradas = []

# Iterar sobre las columnas de la matriz de correlación
for i in range(len(correlation_matrix.columns)):
    for j in range(i+1, len(correlation_matrix.columns)): # i+1 para no duplicar pares ni incluir la diagonal
            coef_correlacion = correlation_matrix.iloc[i, j]
        # Filtrar las correlaciones por su valor absoluto
            if abs(coef_correlacion) > 0.5:
              correlaciones_filtradas.append([correlation_matrix.index[i], correlation_matrix.columns[j], coef_correlacion])


# Crear un nuevo DataFrame con los pares de correlaciones filtrados
df_correlaciones_filtradas = pd.DataFrame(correlaciones_filtradas, columns=['Variable1', 'Variable2', 'Correlacion'])

print(df_correlaciones_filtradas)
                    Variable1                  Variable2  Correlacion
0              Happiness Rank            Happiness Score    -0.993905
1              Happiness Rank   Economy (GDP per Capita)    -0.783247
2              Happiness Rank                     Family    -0.686502
3              Happiness Rank   Health (Life Expectancy)    -0.741182
4              Happiness Rank                    Freedom    -0.545570
5              Happiness Rank          Dystopia Residual    -0.522146
6              Happiness Rank  Upper Confidence Interval    -0.691347
7             Happiness Score   Economy (GDP per Capita)     0.779171
8             Happiness Score                     Family     0.693547
9             Happiness Score   Health (Life Expectancy)     0.734491
10            Happiness Score                    Freedom     0.556414
11            Happiness Score          Dystopia Residual     0.526343
12            Happiness Score  Upper Confidence Interval     0.694806
13             Standard Error                        Año    -0.883201
14             Standard Error  Lower Confidence Interval    -0.735704
15   Economy (GDP per Capita)                     Family     0.566283
16   Economy (GDP per Capita)   Health (Life Expectancy)     0.789103
17   Economy (GDP per Capita)  Upper Confidence Interval     0.572879
18                     Family   Health (Life Expectancy)     0.569937
19                        Año  Lower Confidence Interval     0.832997
20  Lower Confidence Interval  Upper Confidence Interval     0.685624

La matriz de correlación revela patrones interesantes y significativos en las relaciones entre diversas variables relacionadas con la felicidad; por ejemplo, hay una correlación negativa casi perfecta entre el 'Happiness Rank' y el 'Happiness Score', lo que sugiere que cuanto más bajo es el rango, mayor es la felicidad. Además, factores clave como la economía, la salud, las relaciones familiares y la libertad personal muestran fuertes correlaciones positivas con la puntuación de felicidad, lo que indica su papel fundamental en el bienestar de las personas. Estos hallazgos destacan la importancia de un enfoque multifacético para entender y mejorar la felicidad, y sugieren áreas potenciales de enfoque para políticas y programas destinados a aumentar el bienestar general.

5.4 Agrupar por País (Máximo Felicidad)¶

In [23]:
#Agrupar el DataFrame por país y obtener el máximo de felicidad
df_agrupado = df.groupby('Country', as_index=False)['Happiness Score'].max()

# Mostrar el DataFrame agrupado
print(df_agrupado )
         Country  Happiness Score
0    Afghanistan            3.575
1        Albania            4.959
2        Algeria            6.355
3         Angola            4.033
4      Argentina            6.650
..           ...              ...
159    Venezuela            6.810
160      Vietnam            5.360
161        Yemen            4.077
162       Zambia            5.129
163     Zimbabwe            4.610

[164 rows x 2 columns]
In [24]:
# Combinar el DataFrame original con el DataFrame agrupado para obtener todas las demás columnas
df_resultado = pd.merge(df, df_agrupado, on=['Country', 'Happiness Score'], how='inner')

# Mostrar el DataFrame completo resultado
print(df_resultado)
         Country                           Region  Happiness Rank  \
0    Switzerland                   Western Europe               1   
1        Iceland                   Western Europe               2   
2        Denmark                   Western Europe               3   
3         Norway                   Western Europe               4   
4         Canada                    North America               5   
..           ...                              ...             ...   
164   Madagascar               Sub-Saharan Africa             148   
165       Rwanda               Sub-Saharan Africa             152   
166        Benin               Sub-Saharan Africa             153   
167         Togo               Sub-Saharan Africa             155   
168        Syria  Middle East and Northern Africa             156   

     Happiness Score  Standard Error  Economy (GDP per Capita)   Family  \
0              7.587        0.034110                   1.39651  1.34951   
1              7.561        0.048840                   1.30232  1.40223   
2              7.527        0.033280                   1.32548  1.36058   
3              7.522        0.038800                   1.45900  1.33095   
4              7.427        0.035530                   1.32629  1.32261   
..               ...             ...                       ...      ...   
164            3.695        0.002293                   0.27954  0.46115   
165            3.515        0.002293                   0.32846  0.61586   
166            3.484        0.002293                   0.39499  0.10419   
167            3.303        0.002293                   0.28123  0.00000   
168            3.069        0.002293                   0.74719  0.14866   

     Health (Life Expectancy)  Freedom  Trust (Government Corruption)  \
0                     0.94143  0.66557                        0.41978   
1                     0.94784  0.62877                        0.14145   
2                     0.87464  0.64938                        0.48357   
3                     0.88521  0.66973                        0.36503   
4                     0.90563  0.63297                        0.32957   
..                        ...      ...                            ...   
164                   0.37109  0.13684                        0.07506   
165                   0.31865  0.54320                        0.50521   
166                   0.21028  0.39747                        0.06681   
167                   0.24811  0.34678                        0.11587   
168                   0.62994  0.06912                        0.17233   

     Generosity  Dystopia Residual   Año  Lower Confidence Interval  \
0       0.29678            2.51738  2015                   2.849648   
1       0.43630            2.70201  2015                   2.849648   
2       0.34139            2.49204  2015                   2.849648   
3       0.34699            2.46531  2015                   2.849648   
4       0.45811            2.45176  2015                   2.849648   
..          ...                ...   ...                        ...   
164     0.22040            2.15075  2016                   3.621000   
165     0.23552            0.96819  2016                   3.444000   
166     0.20180            2.10812  2016                   3.404000   
167     0.17517            2.13540  2016                   3.192000   
168     0.48397            0.81789  2016                   2.936000   

     Upper Confidence Interval  
0                     5.206201  
1                     5.206201  
2                     5.206201  
3                     5.206201  
4                     5.206201  
..                         ...  
164                   3.769000  
165                   3.586000  
166                   3.564000  
167                   3.414000  
168                   3.202000  

[169 rows x 15 columns]
In [25]:
df_agrupado.describe()
Out[25]:
Happiness Score
count 164.000000
mean 5.437366
std 1.120456
min 2.905000
25% 4.569500
50% 5.297000
75% 6.302250
max 7.587000
In [26]:
df_resultado.describe()
Out[26]:
Happiness Rank Happiness Score Standard Error Economy (GDP per Capita) Family Health (Life Expectancy) Freedom Trust (Government Corruption) Generosity Dystopia Residual Año Lower Confidence Interval Upper Confidence Interval
count 169.000000 169.000000 169.000000 169.000000 169.000000 169.000000 169.000000 169.000000 169.000000 169.000000 169.000000 169.000000 169.000000
mean 77.769231 5.419538 0.026614 0.877757 0.886365 0.578561 0.399952 0.144118 0.240555 2.292228 2015.491124 3.981720 5.281942
std 45.007407 1.130550 0.028097 0.419272 0.296667 0.248018 0.154398 0.116709 0.131641 0.531190 0.501407 1.373518 0.742458
min 1.000000 2.905000 0.002293 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.654290 2015.000000 2.732000 3.078000
25% 40.000000 4.565000 0.002293 0.545580 0.716290 0.388470 0.280980 0.064130 0.150110 1.974780 2015.000000 2.849648 5.206201
50% 78.000000 5.291000 0.020430 0.974380 0.916120 0.623660 0.413190 0.110230 0.219000 2.273500 2015.000000 2.849648 5.206201
75% 116.000000 6.269000 0.044540 1.241420 1.097740 0.763760 0.522340 0.180370 0.311050 2.591150 2016.000000 5.063000 5.271000
max 157.000000 7.587000 0.136930 1.690420 1.402230 1.025250 0.669730 0.522080 0.819710 3.837720 2016.000000 7.351000 7.475000
In [27]:
# Crear un gráfico de dispersión (scatter plot) con Plotly para la relación entre felicidad y generosidad
fig = px.scatter(df, x='Generosity', y='Happiness Score', color='Freedom',
                 title='Relación entre Felicidad, Generosidad y Libertad')

# Personalizar el diseño del gráfico
fig.update_layout(xaxis_title='Generosidad',
                  yaxis_title='Puntuación de Felicidad')

# Mostrar el gráfico
fig.show()

El gráfico sugiere que la libertad podría tener un papel más significativo en la felicidad que la generosidad, dada la presencia de colores que indican niveles más altos de libertad en las regiones con puntuaciones de felicidad superiores, aunque la relación entre generosidad y felicidad no es claramente definida.

5.6 Distribución del Grado de Distopía por Región¶

In [28]:
# Crear un gráfico de barras con Plotly para la distribución del grado de distopía por región
fig = px.bar(df, x='Region', y='Dystopia Residual', title='Distribución del Grado de Distopía por Región')

# Personalizar el diseño del gráfico
fig.update_layout(xaxis_title='Región',
                  yaxis_title='Grado de Distopía')

# Mostrar el gráfico en el Notebook
fig.show()

Las regiones de Europa Occidental y África Subsahariana muestran los grados más altos de distopía, mientras que América del Norte y Asia Meridional tienen los niveles más bajos en comparación. Esto puede indicar diferencias significativas en la percepción o existencia de condiciones distópicas entre estas regiones.

In [29]:
# Crear un gráfico de caja y bigotes (box plot) con Plotly para la distribución del grado de distopía por región
fig = px.box(df, x='Region', y='Dystopia Residual', title='Distribución del Grado de Distopía por Región')

# Personalizar el diseño del gráfico
fig.update_layout(xaxis_title='Región',
                  yaxis_title='Grado de Distopía')

# Mostrar el gráfico en el Notebook
fig.show()

El gráfico muestra un diagrama de caja de la distribución del grado de distopía por región. Las líneas centrales de las cajas representan la mediana de los datos de cada región. La variabilidad del grado de distopía se indica a través del rango intercuartílico (la altura de las cajas), y los puntos por encima o debajo de las "bigotes" (líneas verticales) sugieren valores atípicos. Las regiones parecen tener medianas similares con variaciones en la dispersión y en los valores atípicos, lo que indica diferencias en la consistencia del grado de distopía entre regiones.

6. Conclusiones¶

Los datos analizados sugieren que factores como la libertad y la economía tienen una influencia notable en la felicidad de las personas, mientras que la generosidad parece tener un efecto menos directo. Además, la percepción del grado de distopía es similar en distintas regiones, aunque con variabilidad notable en algunas de ellas. Esto refleja la complejidad de las cuestiones sociales y cómo se perciben en diferentes contextos geográficos y culturales.

7. Recomendaciones¶

Es crucial para los responsables de la formulación de políticas y programas de desarrollo centrarse en mejorar la libertad y las condiciones económicas para potenciar la felicidad. Al mismo tiempo, deberían considerar las diferencias regionales en la percepción de la distopía al aplicar estrategias de mejora, asegurando que las medidas sean relevantes y efectivas para cada contexto específico.